/*
 * To change this template, choose Tools | Templates and open the template in the editor.
 */

package com.bekvon.bukkit.residence.protection;

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;

import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;

import pw.yumc.Residence.ResidenceMain;

/**
 *
 * @author Administrator
 */
public class WorldFlagManager {
    protected FlagPermissions globaldefaults;
    protected Map<String, Map<String, FlagPermissions>> groupperms;
    protected Map<String, FlagPermissions> worldperms;
    ResidenceMain plugin;

    public WorldFlagManager(final ResidenceMain plugin) {
        this.plugin = plugin;
        globaldefaults = new FlagPermissions();
        worldperms = new HashMap<String, FlagPermissions>();
        groupperms = new HashMap<String, Map<String, FlagPermissions>>();
        this.parsePerms(plugin.getConfig());
    }

    public FlagPermissions getPerms(final Player player) {
        return this.getPerms(player.getWorld().getName(), plugin.getPermissionManager().getGroupNameByPlayer(player));
    }

    public FlagPermissions getPerms(String world) {
        world = world.toLowerCase();
        final FlagPermissions list = worldperms.get(world);
        if (list == null) {
            if (globaldefaults == null) {
                return new FlagPermissions();
            }
            return globaldefaults;
        }
        return list;
    }

    public FlagPermissions getPerms(String world, String group) {
        world = world.toLowerCase();
        group = group.toLowerCase();
        final Map<String, FlagPermissions> groupworldperms = groupperms.get(group);
        if (groupworldperms == null) {
            return this.getPerms(world);
        }
        FlagPermissions list = groupworldperms.get(world);
        if (list == null) {
            list = groupworldperms.get("global." + world);
            if (list == null) {
                list = groupworldperms.get("global");
            }
            if (list == null) {
                return this.getPerms(world);
            }
        }
        return list;
    }

    public void parsePerms(final FileConfiguration config) {
        try {
            Set<String> keys = config.getConfigurationSection("Global.Flags").getKeys(false);
            if (keys != null) {
                for (final String key : keys) {
                    if (key.equalsIgnoreCase("Global")) {
                        globaldefaults = FlagPermissions.parseFromConfigNode(key, config.getConfigurationSection("Global.Flags"));
                    } else {
                        worldperms.put(key.toLowerCase(), FlagPermissions.parseFromConfigNode(key, config.getConfigurationSection("Global.Flags")));
                    }
                }
            }
            for (final Entry<String, FlagPermissions> entry : worldperms.entrySet()) {
                entry.getValue().setParent(globaldefaults);
            }
            keys = config.getConfigurationSection("Groups").getKeys(false);
            if (keys != null) {
                for (final String key : keys) {
                    final ConfigurationSection worldkeylist = config.getConfigurationSection("Groups." + key + ".Flags.World");
                    if (worldkeylist != null) {
                        final Set<String> worldkeys = config.getConfigurationSection("Groups." + key + ".Flags.World").getKeys(false);
                        if (worldkeys != null) {
                            final Map<String, FlagPermissions> perms = new HashMap<String, FlagPermissions>();
                            for (final String wkey : worldkeys) {
                                FlagPermissions list = FlagPermissions.parseFromConfigNode(wkey, config.getConfigurationSection("Groups." + key + ".Flags.World"));
                                if (wkey.equalsIgnoreCase("global")) {
                                    list.setParent(globaldefaults);
                                    perms.put(wkey.toLowerCase(), list);
                                    for (final Entry<String, FlagPermissions> worldperm : worldperms.entrySet()) {
                                        list = FlagPermissions.parseFromConfigNode(wkey, config.getConfigurationSection("Groups." + key + ".Flags.World"));
                                        list.setParent(worldperm.getValue());
                                        perms.put("global." + worldperm.getKey().toLowerCase(), list);
                                    }
                                } else {
                                    perms.put(wkey.toLowerCase(), list);
                                }
                            }
                            for (final Entry<String, FlagPermissions> entry : perms.entrySet()) {
                                final String wkey = entry.getKey();
                                final FlagPermissions list = entry.getValue();
                                if (!wkey.startsWith("global.")) {
                                    list.setParent(perms.get("global." + wkey));
                                    if (list.getParent() == null) {
                                        list.setParent(worldperms.get(wkey));
                                    }
                                    if (list.getParent() == null) {
                                        list.setParent(globaldefaults);
                                    }
                                }
                            }
                            groupperms.put(key.toLowerCase(), perms);
                        }
                    }
                }
            }
        } catch (final Exception ex) {
            Logger.getLogger(WorldFlagManager.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
